﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using AgenciaViajeServices.Persistencia;
using AgenciaViajeServices.Dominio;
using System.ServiceModel.Web;
using System.Net;


namespace AgenciaViajeServices
{
    public class Usuarios : IUsuarios
    {
        private UsuarioDAO usuarioDAO = null;
        private UsuarioDAO UsuarioDAO
        {
            get
            {
                if (usuarioDAO == null)
                    usuarioDAO = new UsuarioDAO();
                return usuarioDAO;
            }
        }

        private AreaDAO areaDAO = null;
        private AreaDAO AreaDAO
        {
            get
            {
                if (areaDAO == null)
                    areaDAO = new AreaDAO();
                return areaDAO;
            }
        }

        public Usuario CrearUsuario(string nom, string ape, int area,string codg,string ccosto,string dni,string status)
        {
            Area areaExistente = AreaDAO.Obtener(area);
            Usuario usuarioACrear = new Usuario()
            {
                Nombre = nom,
                Apellidos = ape,
                Area = areaExistente.Codigo,
                CodigoG = codg,
                CCosto = ccosto,
                DNI = dni,
                Status = status,
            };
            return UsuarioDAO.Crear(usuarioACrear);
        }

        public Usuario ObtenerUsuario(int codigo)
        {
            return UsuarioDAO.Obtener(codigo);
        }

        public Usuario ModificarUsuario(int codigo, string nom, string ape, int area, string codg, string ccosto, string dni, string status)
        {
            Area areaExistente = AreaDAO.Obtener(area);
            Usuario usuarioAModificar = new Usuario()
            {
                Codigo = codigo,
                Nombre = nom,
                Apellidos = ape,
                Area = areaExistente.Codigo,
                CodigoG = codg,
                CCosto = ccosto,
                DNI = dni,
                Status = status,
            };
            return UsuarioDAO.Modificar(usuarioAModificar);
        }

        public void EliminarUsuario(int codigo)
        {
            Usuario usuarioExistente = UsuarioDAO.Obtener(codigo);
            UsuarioDAO.Eliminar(usuarioExistente);
        }

        public List<Usuario> ListarUsuarios()
        {
            return UsuarioDAO.ListarTodos().ToList();
        }

        public Usuario BuscarUsuario(string codge)
        {
            UsuarioDAO usuarioDAO = new UsuarioDAO();
            Usuario usuarioExistente = usuarioDAO.Buscar(codge);
            if (usuarioExistente == null)
            {
                throw new FaultException<ValidationException>(new ValidationException() { ValidationError = "Usuario No Existe" }, new FaultReason("Usuario No Existe"));
            }
            else if (usuarioExistente.Status == "BLOQUEADO")
            {
                throw new FaultException<ValidationException>(new ValidationException() { ValidationError = "Usuario esta Bloqueado" }, new FaultReason("Usuario Bloqueado"));
            }
            else if (usuarioExistente.Status == "VACACIONES")
            {
                throw new FaultException<ValidationException>(new ValidationException() { ValidationError = "Usuario esta de Vacaciones" }, new FaultReason("Usuario Vacaciones"));
            }
            return  UsuarioDAO.Buscar(codge);
        }
    }
}
